/**
 * Copyright (c) 2010, iDA MediaFoundry
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * - Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * - Neither the name of iDA MediaFoundry nor the names of its contributors may
 *   be used to endorse or promote products derived from this software without
 *   specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
package be.idamf.flash.filesystem
{
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.FileFilter;
	import flash.net.FileReference;
	import flash.net.ObjectEncoding;
	import flash.utils.ByteArray;
	
	/**
	 * Save/load of an AMF3 encoded object to/from disc.
	 */
	public final class AMF3FilePrompt
	{
		/**
		 * Prompts to save an object.
		 */
		public static function save(data:Object, filename:String = "data.amf3"):void
		{
			var bytes:ByteArray = new ByteArray();
			bytes.objectEncoding = ObjectEncoding.AMF3;
			bytes.writeObject(data);
			bytes.position = 0;
			
			var fileReference:FileReference = new FileReference();
			fileReference.save(bytes, filename);
		}
		
		/**
		 * Prompts to load an object.
		 */
		public static function load(target:Object, property:String = "data"):void
		{
			var fileReference:FileReference = new FileReference();
			
			fileReference.addEventListener(Event.SELECT, selectHandler);
			fileReference.addEventListener(Event.CANCEL, cancelHandler);
			
			fileReference.browse([new FileFilter("AMF3", "*.amf3")]);
			
			function cancelHandler(event:Event):void
			{
				fileReference.removeEventListener(Event.SELECT, selectHandler);
				fileReference.removeEventListener(Event.CANCEL, selectHandler);
			}
			
			function selectHandler(event:Event):void
			{
				fileReference.removeEventListener(Event.SELECT, selectHandler);
				fileReference.removeEventListener(Event.CANCEL, selectHandler);
				
				fileReference.addEventListener(Event.COMPLETE, loadHandler);
				fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
				fileReference.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
				
				fileReference.load();
			}
			
			function loadHandler(event:Event):void
			{
				fileReference.removeEventListener(Event.COMPLETE, loadHandler);
				fileReference.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
				fileReference.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
				
				target[property] = fileReference.data.readObject();
			}
			
			function errorHandler(event:Event):void
			{
				fileReference.removeEventListener(Event.COMPLETE, loadHandler);
				fileReference.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
				fileReference.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
			}
		}
	}
}